/*
* Copyright (c) 2008, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.wso2.carbon.wsdl2code;
import org.apache.axis2.rpc.receivers.RPCMessageReceiver;
import org.apache.axis2.transport.local.LocalTransportSender;
import org.apache.axis2.util.CommandLineOption;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URL;
import java.util.*;
public class POMGenerator {
public void generateAxis2Client(Map optionsMap, String codegenOutputDirectory, HashMap<String, String> projOptionsList) throws Exception {
Map<String, String> configurationMap = new HashMap<String, String>();
Map<String, String> predifinedValues = new HashMap<String, String>();
configurationMap.put("uri", "wsdlFile");
configurationMap.put("o", "outputDirectory");
configurationMap.put("a", "syncMode");
configurationMap.put("s", "syncMode");
configurationMap.put("u", "unpackClasses");
configurationMap.put("sn", "serviceName");
configurationMap.put("uw", "unwrap");
configurationMap.put("ap", "allPorts");
configurationMap.put("pn", "portName");
configurationMap.put("p", "packageName");
configurationMap.put("ns2p", "namespaceToPackages");
configurationMap.put("t", "generateTestcase");
configurationMap.put("p", "packageName");
configurationMap.put("l", "language");
configurationMap.put("d", "databindingName");
predifinedValues.put("a", "async");
predifinedValues.put("s", "sync");
checkPreconditions(optionsMap);
String s = IOUtils.toString(Thread.currentThread().getContextClassLoader()
.getResourceAsStream("org/wso2/carbon/wsdl2code/axis-pom.xml"), "UTF-8");
s = s.replace("gid", projOptionsList.get("-gid").toString()).
replace("aid", projOptionsList.get("-aid").toString()).
replace("vn", projOptionsList.get("-vn").toString());
Iterator iterator = optionsMap.keySet().iterator();
String configurations = "";
while (iterator.hasNext()) {
Object o = iterator.next();
configurations += getConfiguratonElement((String) o, (CommandLineOption) optionsMap.get(o), configurationMap, predifinedValues);
}
ArrayList<String> artifactVersions = new ArrayList<String>();
//axis2 dependency
URL url = getContainingArtifact(org.apache.axis2.description.java2wsdl.DefaultSchemaGenerator.class);
String version = getVersion(url.getFile());
artifactVersions.add(version);
//axis2-adb dependency
url = getContainingArtifact(RPCMessageReceiver.class);
version = getVersion(url.getFile());
artifactVersions.add(version);
//axis2 http transport dependency
url = getContainingArtifact(org.apache.axis2.transport.http.HTTPWorker.class);
version = getVersion(url.getFile());
artifactVersions.add(version);
//axis2 local transport dependency
url = getContainingArtifact(LocalTransportSender.class);
version = getVersion(url.getFile());
artifactVersions.add(version);
// url = getContainingArtifact(TestCase.class);
// version = getVersion(url.getFile());
//
// artifactVersions.add(version);
// for (int i = 0; i < artifactVersions.size(); i++) {
// s = s.replace("{dependancy-v-" + (i + 1) + "}", artifactVersions.get(i).replace(".wso2", "-wso2"));
//
// }
s = s.replaceAll("axs_ver", artifactVersions.get(0).replace(".wso2", "-wso2"));
String toWrite = String.format(s, configurations);
createFile(codegenOutputDirectory, toWrite);
}
private static void checkPreconditions(Map optionsMap) {
//if s and a are both present s takes precedence over -a
if (optionsMap.containsKey("s")) {
optionsMap.remove("a");
}
}
private static void createFile(String codegenOutputDirectory, String toWrite) throws IOException {
FileUtils.writeStringToFile(new File(codegenOutputDirectory + File.separator + "pom.xml"), toWrite);
}
public void generateJaxWSClient(List optionsList, String codegenOutputDirectory, HashMap<String, String> projOptionsList) throws Exception {
String s = IOUtils.toString(Thread.currentThread().getContextClassLoader()
.getResourceAsStream("org/wso2/carbon/wsdl2code/jaxws-pom.xml"), "UTF-8");
s = s.replace("gid", projOptionsList.get("-gid").toString()).
replace("aid", projOptionsList.get("-aid").toString()).
replace("vn", projOptionsList.get("-vn").toString());
String wsdlURL = getArgumentValue("-Service", optionsList);
String wsdlOptions = getExtraArgsJaxWS(optionsList);
wsdlOptions += getBindingFiles(optionsList);
wsdlOptions += getServiceName(optionsList);
s = String.format(s, wsdlURL, wsdlOptions);
createFile(codegenOutputDirectory, s);
}
/**
* For CXF Services
*
* @param optionsList
* @return
*/
private static String getServiceName(List optionsList) {
for (int i = 0; i < optionsList.size(); i++) {
if ("-sn".equals((String) optionsList.get(i)) && i + 1 < optionsList.size()) {
return "<serviceName>" + (String) optionsList.get(i + 1) + "</serviceName>";
}
}
return "";
}
/**
* For CXF services
*
* @param optionsList
* @return
*/
private static String getBindingFiles(List optionsList) {
for (int i = 0; i < optionsList.size(); i++) {
if ("-b".equals((String) optionsList.get(i)) && i + 1 < optionsList.size()) {
return "<bindingFiles>\n" + "<bindingFile>" + (String) optionsList.get(i + 1) + "</bindingFile>\n" +
" </bindingFiles>";
}
}
return "";
}
/**
* For Axis2
*
* @param key
* @param value
* @param configurationMap
* @return
*/
public static String getConfiguratonElement(String key, CommandLineOption value, Map configurationMap, Map defaultValueMap) {
String s = (String) configurationMap.get(key);
if (s == null) {
return "";
}
String stringValue = null;
if (value.getOptionValue() == null) {
if (defaultValueMap.containsKey(key)) {
stringValue = (String) defaultValueMap.get(key);
} else {
stringValue = "true";
}
} else {
stringValue = value.getOptionValue();
}
return "<" + s + ">" + stringValue + "</" + s + ">";
}
/**
* For CXF JaxWS
*
* @param optionsList
* @return
*/
public static String getExtraArgsJaxWS(List optionsList) {
String s = "<extraargs>\n";
String[] extraArgsWithoutValue = new String[]{"-client", "-server", "-compile", "-impl", "-all", "-ant", "-autoNameResolution", "-v", "-verbose", "-quiet", "-interface", "-noTypes", "-generateEnums", "-supportMultipleXmlReps", "-inheritResourceParams", "-noVoidForEmptyResponses", "-validate", "-noAddressBinding", "-aer=true"};
String[] extraArgsWithValue = new String[]{"-fe", "-db", "-exsh", "-dns", "-dex", "-wv", "-exceptionSuper"};
//Special cases are used to avoid unpermitted values in html. So a mock value is used in HTML form and mapped it to the correct argument
Map<String, String> specialCases = new HashMap<String, String>();
specialCases.put("-mg", "-mark-generated");
specialCases.put("-defaultValues", null);
specialCases.put("-asyncMethods", null);
specialCases.put("-bareMethods", null);
specialCases.put("-mimeMethods", null);
for (int i = 0; i < optionsList.size(); i++) {
String argument = (String) optionsList.get(i);
if (argument.startsWith("-")) {
for (String temp : extraArgsWithoutValue) {
if (temp.equals(argument)) {
s += "<extraarg>" + argument + "</extraarg>";
break;
}
}
for (String temp : extraArgsWithValue) {
if (temp.equals(argument) && i + 1 < optionsList.size()) {
s += "<extraarg>" + argument + "</extraarg>";
s += "<extraarg>" + (String) optionsList.get(i + 1) + "</extraarg>";
break;
}
}
Iterator<String> iterator = specialCases.keySet().iterator();
while (iterator.hasNext()) {
if (iterator.next().equalsIgnoreCase(argument)) {
String value = specialCases.get(argument);
if (value == null && i + 1 < optionsList.size()) {
s += "<extraarg>" + argument + "=" + (String) optionsList.get(i + 1) + "</extraarg>";
break;
} else {
s += "<extraarg>" + value + "</extraarg>";
break;
}
}
}
}
}
s += "</extraargs>\n";
return s;
}
/**
* For CXF JaxRS
*
* @param optionsList
* @return
*/
public static String getExtraArgsJaxRS(List optionsList) {
String s = "<extraargs>\n";
String[] extraArgsWithoutValue = new String[]{"-client", "-server", "-compile", "-impl", "-all", "-ant", "-autoNameResolution", "-v", "-verbose", "-quiet", "-exceptionSuper", "-interface", "-noTypes", "-generateEnums", "-supportMultipleXmlReps", "-inheritResourceParams", "-noVoidForEmptyResponses"};
String[] extraArgsWithValue = new String[]{"-p", "-sp", "-tMap", "-repMap", "-catalog"};
for (int i = 0; i < optionsList.size(); i++) {
String argument = (String) optionsList.get(i);
if (argument.startsWith("-")) {
for (String temp : extraArgsWithoutValue) {
if (temp.equals(argument)) {
s += "<extraarg>" + argument + "</extraarg>";
}
}
for (String temp : extraArgsWithValue) {
if (temp.equals(argument) && i + 1 < optionsList.size()) {
s += "<extraarg>" + argument + "</extraarg>";
s += "<extraarg>" + (String) optionsList.get(i + 1) + "</extraarg>";
}
}
}
}
s += "</extraargs>\n";
return s;
}
public static String getArgumentValue(String argument, List optionsList) {
for (int i = 0; i < optionsList.size(); i++) {
if (argument.equals((String) optionsList.get(i)) && i + 1 < optionsList.size()) {
return (String) optionsList.get(i + 1);
}
}
return null;
}
public static void generateJaxRSClient(List optionsList, String codegenOutputDirectory, HashMap<String, String> projOptionsList) throws Exception {
String s = IOUtils.toString(Thread.currentThread().getContextClassLoader()
.getResourceAsStream("org/wso2/carbon/wsdl2code/jaxrs-pom.xml"), "UTF-8");
s = s.replace("gid", projOptionsList.get("-gid").toString()).
replace("aid", projOptionsList.get("-aid").toString()).
replace("vn", projOptionsList.get("-vn").toString());
// URL url = getContainingArtifact(javax.ws.rs.core.Application.class);
// String version = getVersion(url.getFile());
// s = s.replace("jsr311-version", version);
String wadlUrl = getArgumentValue("-Service", optionsList);
String wsdlOptions = getExtraArgsJaxRS(optionsList);
s = String.format(s, wadlUrl, wsdlOptions);
createFile(codegenOutputDirectory, s);
}
public static URL getContainingArtifact(Class clazz) {
if (clazz == null ||
clazz.getProtectionDomain() == null ||
clazz.getProtectionDomain().getCodeSource() == null ||
clazz.getProtectionDomain().getCodeSource().getLocation() == null)
// This typically happens for system classloader
// (java.lang.* etc. classes)
return null;
return clazz.getProtectionDomain()
.getCodeSource().getLocation();
}
public static String getVersion(String artifact) throws Exception {
java.io.File file = new java.io.File(artifact);
java.util.jar.JarFile jar = new java.util.jar.JarFile(file);
java.util.jar.Manifest manifest = jar.getManifest();
String versionNumber = "";
java.util.jar.Attributes attributes = manifest.getMainAttributes();
if (attributes != null) {
java.util.Iterator it = attributes.keySet().iterator();
while (it.hasNext()) {
java.util.jar.Attributes.Name key = (java.util.jar.Attributes.Name) it.next();
String keyword = key.toString();
if (keyword.equals("Implementation-Version") || keyword.equals("Bundle-Version")) {
versionNumber = (String) attributes.get(key);
break;
}
}
}
jar.close();
if (versionNumber != null && !versionNumber.equals("")) {
return versionNumber;
}
//if manifest does not contain version number it had to be extracted from the file name
String fileName = file.getName().substring(0, file.getName().lastIndexOf("."));
if (fileName.contains(".")) {
String majorVersion = fileName.substring(0, fileName.indexOf("."));
String minorVersion = fileName.substring(fileName.indexOf("."));
int delimiter = majorVersion.lastIndexOf("-");
if (majorVersion.indexOf("_") > delimiter) delimiter = majorVersion.indexOf("_");
majorVersion = majorVersion.substring(delimiter + 1, fileName.indexOf("."));
versionNumber = majorVersion + minorVersion;
}
return versionNumber;
}
}